/* 
 * ExceptionInterceptor.java
 * 
 * Data de criação: 26/08/2010
 * 
 * CORPORATIVO - MTE. 
 *
 */
package br.com.o2solutions.siso.webapp.interceptor;

import java.util.List;

import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.intercept.AroundInvoke;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.core.Events;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.intercept.InvocationContext;
import org.jboss.seam.international.StatusMessage.Severity;

import br.com.o2solutions.core.exception.BusinessException;
import br.com.o2solutions.util.collection.CollectionUtil;

/**
 * Classe responsável por realizar a interceptação da chamada aos métodos das
 * actions anotadas e trata-lás, quanto necessário.
 * 
 * @author osvaldeir
 * @since 26/08/2010
 * 
 */
@Name("exceptionInterceptor")
public class ExceptionInterceptor {

	/**
	 * Realiza a interceptação das operações invocadas pelas Actions e, caso
	 * ocorra algum erro negocial, seta a mensagem de Erro com a chave e
	 * argumentos do erro.
	 * 
	 * @param invocation
	 *            Objeto invocador do metodo
	 * @return Object Retorno do metodo
	 * @throws Exception
	 *             Caso alguma falha não negocial aconteça
	 */
	@AroundInvoke
	public Object execute(InvocationContext invocation) throws Exception {
		Object result = null;
		try {
			result = invocation.proceed();
		} catch (BusinessException e) {
			Contexts.getEventContext().set("invalid", true);
			final List<BusinessException> validateExceptions = e
					.getValidateExceptions();
			if (!CollectionUtil.isEmpty(validateExceptions)) {
				for (BusinessException businessException : validateExceptions) {
					FacesMessages.instance().addFromResourceBundle(
							Severity.ERROR, businessException.getKeyMessage(),
							businessException.getErrorArgs());
				}
			} else {
				FacesMessages.instance().addFromResourceBundle(Severity.ERROR,
						e.getKeyMessage(), e.getErrorArgs());
			}
			Events.instance().raiseEvent("br.com.o2solutions.siso.validationFailed");
		}
		return result;
	}

}
